// Pango.Attribute - Attribute "base class"
//
// Copyright (c) 2005, 2007, 2008 Novell, Inc.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the Lesser GNU General 
// Public License as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this program; if not, write to the
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
// Boston, MA 02111-1307, USA.

namespace Pango {

	using System;
	using System.Runtime.InteropServices;

	public class Attribute : GLib.IWrapper, IDisposable {

		IntPtr raw;

		internal Attribute(IntPtr raw) {
			this.raw = raw;
		}

		static Pango.AttrType GetAttrType(IntPtr raw) {
			if (raw == IntPtr.Zero)
				return AttrType.Invalid;
			IntPtr klass = Marshal.ReadIntPtr(raw);
			return (AttrType)Marshal.ReadInt32(klass);
		}

		public static Attribute GetAttribute(IntPtr raw) {
			switch (GetAttrType(raw)) {
				case Pango.AttrType.Language:
					return new AttrLanguage(raw);
				case Pango.AttrType.Family:
					return new AttrFamily(raw);
				case Pango.AttrType.Style:
					return new AttrStyle(raw);
				case Pango.AttrType.Weight:
					return new AttrWeight(raw);
				case Pango.AttrType.Variant:
					return new AttrVariant(raw);
				case Pango.AttrType.Stretch:
					return new AttrStretch(raw);
				case Pango.AttrType.Size:
					return new AttrSize(raw);
				case Pango.AttrType.FontDesc:
					return new AttrFontDesc(raw);
				case Pango.AttrType.Foreground:
					return new AttrForeground(raw);
				case Pango.AttrType.Background:
					return new AttrBackground(raw);
				case Pango.AttrType.Underline:
					return new AttrUnderline(raw);
				case Pango.AttrType.Strikethrough:
					return new AttrStrikethrough(raw);
				case Pango.AttrType.Rise:
					return new AttrRise(raw);
				case Pango.AttrType.Shape:
					return new AttrShape(raw);
				case Pango.AttrType.Scale:
					return new AttrScale(raw);
				case Pango.AttrType.Fallback:
					return new AttrFallback(raw);
				case Pango.AttrType.LetterSpacing:
					return new AttrLetterSpacing(raw);
				case Pango.AttrType.UnderlineColor:
					return new AttrUnderlineColor(raw);
				case Pango.AttrType.StrikethroughColor:
					return new AttrStrikethroughColor(raw);
				case Pango.AttrType.Gravity:
					return new AttrGravity(raw);
				case Pango.AttrType.GravityHint:
					return new AttrGravityHint(raw);
				default:
					return new Attribute(raw);
			}
		}

		~Attribute() {
			Dispose();
		}

		[DllImport("pango-1.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
		static extern void pango_attribute_destroy(IntPtr raw);

		public void Dispose() {
			if (raw != IntPtr.Zero) {
				pango_attribute_destroy(raw);
				raw = IntPtr.Zero;
			}
			GC.SuppressFinalize(this);
		}

		public IntPtr Handle {
			get {
				return raw;
			}
		}

		public static GLib.GType GType {
			get {
				return GLib.GType.Pointer;
			}
		}

		public Pango.AttrType Type {
			get { return GetAttrType(raw); }
		}

		internal struct NativeStruct {
			IntPtr klass;
			public uint start_index;
			public uint end_index;
		}

		NativeStruct Native {
			get { return (NativeStruct)Marshal.PtrToStructure(raw, typeof(NativeStruct)); }
		}

		public uint StartIndex {
			get { return Native.start_index; }
			set {
				NativeStruct native = Native;
				native.start_index = value;
				Marshal.StructureToPtr(native, raw, false);
			}
		}

		public uint EndIndex {
			get { return Native.end_index; }
			set {
				NativeStruct native = Native;
				native.end_index = value;
				Marshal.StructureToPtr(native, raw, false);
			}
		}

		[DllImport("pango-1.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
		static extern IntPtr pango_attribute_copy(IntPtr raw);

		public Pango.Attribute Copy() {
			return GetAttribute(pango_attribute_copy(raw));
		}

		[DllImport("pango-1.0-0.dll", CallingConvention = CallingConvention.Cdecl)]
		static extern bool pango_attribute_equal(IntPtr raw1, IntPtr raw2);

		public bool Equal(Pango.Attribute attr2) {
			return pango_attribute_equal(raw, attr2.raw);
		}
	}
}